package com.itheima.d03_api_bigdecimal;

import cn.hutool.core.util.NumberUtil;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 目标：掌握BigDecimal的基本使用
 */
public class Test {

    public static void main(String[] args) {
        //1.现象：浮点型数据运算，可能结果失真/丢失精度
        System.out.println(0.1 + 0.2);
        System.out.println(1.0 - 0.32);
        System.out.println(1.015 * 100);
        System.out.println(1.301 / 100);

        //2.解决方案：使用BigDecimal类
        //2.1 创建BigDecimal对象
        //BigDecimal bd1 = new BigDecimal(0.1);   //不推荐，无效
        //BigDecimal bd2 = new BigDecimal("0.2"); //不推荐，有效，书写麻烦
        BigDecimal bd1 = BigDecimal.valueOf(0.1); //推荐
        BigDecimal bd2 = BigDecimal.valueOf(0.2); //推荐

        //2.2 调用功能方法实现运算
        System.out.println("========加==========");
        BigDecimal addResult = bd1.add(bd2);
        double addNumResult = addResult.doubleValue();
        System.out.println(addResult);
        System.out.println(addNumResult);

        System.out.println("=========减=========");
        System.out.println(BigDecimal.valueOf(1.0).subtract(BigDecimal.valueOf(0.32)));

        System.out.println("=========乘=========");
        System.out.println(BigDecimal.valueOf(1.015).multiply(BigDecimal.valueOf(100)));

        System.out.println("=========除=========");
        System.out.println(BigDecimal.valueOf(1.301).divide(BigDecimal.valueOf(100)));

        System.out.println("=========保留指定小数位的除=========");
        //注意事项：除法，存在除不尽的情况，结果本身就是不精确
        //结果方案：除法，提供配置保留指定小数位的方法，选择保存的模式（四舍五入）
        //         divide(被除数，保留小数位，模式)                                                         四舍五入
        BigDecimal result = BigDecimal.valueOf(0.1).divide(    BigDecimal.valueOf(0.3)  ,5  , RoundingMode.HALF_UP);
        System.out.println(result);

        /*
            3.使用场景：高精度计算
                    金融计算
                    科学计算
                    税收计算
                    统计分析和大数据处理
                    折扣/货币计算
                    汇率计算
                    ... ...
         */
        System.out.println("=========Hutool=========");
        double addResult1 = NumberUtil.add(0.1, 0.2);
        double subResult1 = NumberUtil.sub(1.0, 0.32);
        double mulResult1 = NumberUtil.mul(1.015 ,100);
        double divResult1 = NumberUtil.div(1.301 , 100);

        System.out.println(addResult1);
        System.out.println(subResult1);
        System.out.println(mulResult1);
        System.out.println(divResult1);


    }
}
